package javachongkao.面向对象上.构造方法与初始化模块;

import java.util.Scanner;
//7-2 jmu-Java-03面向对象基础-02-构造方法与初始化块

//1.定义一个Person类
//属性：String name, boolean gender, int age, int id ,所有的变量必须为私有(private)。
//无参构造函数:Person(), 功能：打印This is constructor  。
//有参构造函数:Person(name, gender, age)   ，功能：给属性赋值。
//建议：使用Eclipse自动生成toString方法
//
//2.定义类的初始化块
//为Person类加入初始化块，在初始化块中对id属性赋值，并且要保证每次的值比上次创建的对象的值+1。然后在下一行打印This is initialization block, id is ...  其中...是id的值。
//提示：可为Person类定义一个static属性来记录所创建的对象个数。
//
//3.编写静态初始化块
//打印This is static initialization block
//
//4.编写main方法
//首先输入n，代表要创建的对象数量。
//然后从控制台分别读取n行的name age gender, 并调用有参构造函数Person(name, age, gender)新建对象 。
//将创建好的n个对象逆序输出(即输出toString()方法)。
//使用无参构造函数新建一个Person对象，然后直接打印该对象。
//思考
//初始化类与对象有几种方法，构造函数、初始化块、静态初始化块。这三种方法执行的先后顺序是什么？各执行几次。
public class Main {
    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);

        int n = sc.nextInt();

        Person[] p = new Person[n];
        for (int i = 0; i < n; i++) {
            String name = sc.next();
            int age = sc.nextInt();
            boolean gender = "true".equals(sc.next());
            p[i] = new Person(name,age,gender);
        }

        for (int i = n-1; i >=0; i--) {
            System.out.println(p[i]);
        }
        Person p1 = new Person();
        System.out.println(p1);

    }

}
class Person{
    private String name;
    private int age;
    private boolean sex;

    private  int id;
    static int num = -1;

    {
        num+=1;
        System.out.println("This is initialization block, id is "+num);

    }

    static{
        System.out.println("This is static initialization block");
    }

    public Person() {
        this.id = num;
        System.out.println("This is constructor");
        System.out.println(name+","+age+","+sex+","+num);
    }

    public Person(String name, int age, boolean sex) {
        this.name = name;
        this.age = age;
        this.sex = sex;
        this.id = num;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public boolean getSex() {
        return sex;
    }

    public void setSex(boolean sex) {
        this.sex = sex;
    }

    public String toString() {
        return "Person [name=" + name + ", age=" + age + ", gender=" + sex + ", id=" + id + "]";
    }

}